#ifndef _COMM_HASH_TABLE_H_
#define _COMM_HASH_TABLE_H_

#include <stdlib.h>
#include <string.h>
#include <assert.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct hash_item
{
    const void * key;
    const void * data;
} hash_item;

//struct hash_table;
typedef struct hash_table hash_table;

//key值比较函数  用来比较两个key的大小 规则类似于strcmp
typedef int (*func_hash_cmp)(const void *key1, const void * key2,
                             void * ctx);
//key值计算函数 用来生成下标
typedef unsigned int (*func_hash_key)(const void * key, void * ctx);

typedef void (*func_free)(void * p);
//创建hash表
hash_table * hash_table_create(unsigned int size, 
                           func_hash_cmp hash_cmp, 
                           func_hash_key hash_key,
                           void * ctx);

void * hash_table_user_data(hash_table * m);

//销毁hash标
void hash_table_free_data_and_destory(hash_table * m, func_free free_key, func_free free_date);
void hash_table_destory(hash_table * m);

//设置 
hash_item * hash_table_set(hash_table * m,
                   const void * key, const void * data);

//获取值  如果找不到则返回0
const void * hash_table_get(hash_table * m, const void * key);

//获取hash表中的项
hash_item * hash_table_find(hash_table * m, const void * key);

//获取hash表中的项
hash_item * hash_table_find_or_insert(hash_table * m, const void * key,
                                      int * insert);

//删除key值对应的项
void hash_table_remove(struct hash_table * m, const void * key);

//遍历  当ite为0 则返回第一个
hash_item * hash_table_next(hash_table * m, const hash_item * ite);

unsigned int hash_table_size(hash_table * m);


//字符串作为key的hash表
hash_table * str_hash_table_create(unsigned int size, void * ctx);
void * str_hash_table_set(hash_table * m, const char * key, const void * data);
void * str_hash_table_remove(struct hash_table * m, const char * key);
void str_hash_table_destory(hash_table * m);

#ifdef __cplusplus
}
#endif

#endif  // _COMM_HASH_MAP_H_
